package top.goldenyear.porpoise.framework.security.core.util;

import cn.dev33.satoken.stp.StpUtil;
import top.goldenyear.porpoise.common.core.util.solon.SolonUtils;
import top.goldenyear.porpoise.framework.common.model.LoginUser;
import top.goldenyear.porpoise.framework.web.config.WebProps;
import cn.hutool.v7.core.text.StrUtil;
import org.noear.solon.core.handle.Context;
import org.noear.solon.lang.Nullable;

/**
 * 安全服务工具类
 *
 * @author Airhead
 */
public class SecurityUtils {

  public static final String AUTHORIZATION_BEARER = "Bearer";
  private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id";
  private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type";

  private SecurityUtils() {}

  /**
   * 从请求中，获得认证 Token
   *
   * @param context 请求
   * @param header 认证 Token 对应的 Header 名字
   * @return 认证 Token
   */
  public static String obtainAuthorization(Context context, String header) {
    String authorization = context.header(header);
    if (!StrUtil.isNotBlank(authorization)) {
      return null;
    }
    int index = authorization.indexOf(AUTHORIZATION_BEARER + " ");
    if (index == -1) { // 未找到
      return null;
    }
    return authorization.substring(index + 7).trim();
  }

  /**
   * 获得当前认证信息
   *
   * @return 认证信息
   */
  public static Object getAuthentication() {
    return null;
  }

  /**
   * 获取当前用户
   *
   * @return 当前用户
   */
  @Nullable
  public static LoginUser getLoginUser() {
    return UserContext.getLoginUser();
  }

  /**
   * 设置当前用户
   *
   * @param loginUser 登录用户
   */
  public static void setLoginUser(LoginUser loginUser) {
    UserContext.setLoginUser(loginUser);
  }

  /**
   * 获得当前用户的编号，从上下文中
   *
   * @return 用户编号
   */
  @Nullable
  public static Long getLoginUserId() {
    return StpUtil.getLoginIdAsLong();
  }

  public static String getUserName() {
    return UserContext.getLoginUserName();
  }

  public static String getNickName() {
    return UserContext.getLoginNickName();
  }

  private static Object buildAuthentication(LoginUser loginUser, Context context) {
    return null;
  }

  public static void setLoginUserId(Context context, Long userId) {
    context.attrSet(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId);
  }

  /**
   * 设置用户类型
   *
   * @param context 请求
   * @param userType 用户类型
   */
  public static void setLoginUserType(Context context, Integer userType) {
    context.attrSet(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType);
  }

  /**
   * 获得当前用户的类型 注意：该方法仅限于 web 相关的 framework 组件使用！！！
   *
   * @param context 请求
   * @return 用户编号
   */
  public static Integer getLoginUserType(Context context) {
    if (context == null) {
      return null;
    }
    // 1. 优先，从 Attribute 中获取
    Integer userType = context.attr(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE);
    if (userType != null) {
      return userType;
    }

    //    // 2. 其次，基于 URL 前缀的约定
    //    if (context.path().startsWith(properties().getAdminApi().getPrefix())) {
    //      return UserType.ADMIN.getValue();
    //    }
    //
    //    if (context.path().startsWith(properties().getAppApi().getPrefix())) {
    //      return UserType.MEMBER.getValue();
    //    }

    return null;
  }

  public static Integer getLoginUserType() {
    return getLoginUserType(Context.current());
  }

  public static WebProps properties() {
    return SolonUtils.getBean(WebProps.class);
  }
}
